#HTTP协议请求实战
"""
1）GET请求：GET请求会通过URL网址传递信息，可以直接在URL中写上要传递的信息，也可以由表单进行传递。
如果使用表单进行传递，这表单中的信息会自动转为URL地址中的数据,通过URL地址传递
2）POST请求：可以向服务器提交数据，是一种比较主流也比较安全地数据传递方式，比如在登录时，经常使用POST请求发送数据

3）PUT请求：请求服务器存储一个资源，通常要指定存储的位置
4)DELETE请求：
5)HEAD请求
6)OPTIONS请求
"""
#GET请求实例分析——实现百度信息的自动搜索
import urllib.request
import re
keywd="Python"
keywd_code=urllib.request.quote(keywd)
#page=(num-1)*10
#爬取前10页的内容
for i in range(1,11):
    url = "https://www.baidu.com/s?wd=" + keywd_code + "pn="+str((i-1)*10)
    #爬虫不会对字符自动转码，而url是不能包含中文字符的
    #卧槽！！！连注释都要讲究一起缩进

    #百度搜索页面反爬了！！！！！，所以要模拟浏览器访问
    req=urllib.request.Request(url)
    req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36")
    data=urllib.request.urlopen(req).read().decode("utf-8")

    #data=urllib.request.urlopen(url).read().decode("utf-8")
    pat2='"title":"(.*?)",'
    result=re.compile(pat2).findall(data)
    for j in range(len(result)):
        print(result[j])
#提取多页的





"""
import urllib.request
keyword = '吕铭'
url="https://www.baidu.com/s?wd="+keyword
req=urllib.request.Request(url)#构造一个Request对象并赋给req
data=urllib.request.urlopen(req).read()#通过这个打开Request对象
#由于网址中包含了GET请求信息，所以会以GET请求的方式获取该页面，随后读取该页面的内容并且赋值给data
#最后爬取到的内容写入网页文件中
fhandle=open("C:\\Users\\DELL\\Desktop\\python操作文件夹\\GET实例.html","wb")
#w:写入模式，创建新文件/覆盖旧文件（覆盖旧有数据）
#b:以二进制模式写入
fhandle.write(data)
fhandle.close()

运行结果：UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-11: ordinal not in range(128)

上面代码有不完善的地方，检索词为中文，这是由编码问题造成的
"""

#！！！！！！！！搜狗的页面是可以打开的，可见百度对本地关于百度搜索的html文件，是有限制的！！！！！！
#import urllib.request
keyword = "吕铭"
url="https://www.sogou.com/tx?query="
keyword_code=urllib.request.quote(keyword)
url_all=url+keyword_code
req=urllib.request.Request(url_all)#构造一个Request对象并赋给req
#好像必须得模拟浏览器访问
req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36")
data=urllib.request.urlopen(req).read()#通过这个打开Request对象
#由于网址中包含了GET请求信息，所以会以GET请求的方式获取该页面，随后读取该页面的内容并且赋值给data
#最后爬取到的内容写入网页文件中
fhandle=open("C:/Users/DELL/Desktop/python操作文件夹/get.html","wb")#现在这个页面打不开的，进去就是百度安全验证
#w:写入模式，创建新文件/覆盖旧文件（覆盖旧有数据）
#b:以二进制模式写入
fhandle.write(data)
fhandle.close()
"""
#优化代码
#import urllib.request
keyword = "韦玮老师"
url="https://www.baidu.com/s?wd="
keyword_code=urllib.request.quote(keyword)
url_all=url+keyword_code
req=urllib.request.Request(url_all)#构造一个Request对象并赋给req
#好像必须得模拟浏览器访问
req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36")
data=urllib.request.urlopen(req).read()#通过这个打开Request对象
#由于网址中包含了GET请求信息，所以会以GET请求的方式获取该页面，随后读取该页面的内容并且赋值给data
#最后爬取到的内容写入网页文件中
fhandle=open("C:/Users/DELL/Desktop/python操作文件夹/get.html","wb")#现在这个页面打不开的，进去就是百度安全验证
#w:写入模式，创建新文件/覆盖旧文件（覆盖旧有数据）
#b:以二进制模式写入
fhandle.write(data)
fhandle.close()
"""



#POST请求实战
"""
进行注册、登录等操作的时候，基本上都会遇到POST请求

构造POST请求，实现思路如下：
1）设置好URL网址
2）构建表单数据(格式为字典形式)，并使用urllib.parse.urlencode对数据进行编码处理
3）创建Request对象，参数包括URL地址和要传递的数据
4）使用add_header()添加头信息，模拟浏览器进行爬取
5）使用urllib.request.urlopen()打开对应的Request对象，完成信息的传递
6）后续处理，比如读取网页内容、将内容写入文件等
"""


#提交之后，进行处理的网页地址
#import urllib.request,上面的代码已经写了
import urllib.parse
url = "http://www.iqianyue.com/mypost/"
#将数据使用urlencode编码处理后，使用encode（）设置为utf-8编码
postdata=urllib.parse.urlencode({
    "name":"dadadad",
    "pass":"1234567"
}).encode("utf-8")
req=urllib.request.Request(url,postdata)
req.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36")
data=urllib.request.urlopen(req).read()
fhandle=open("C:/Users/DELL/Desktop/python操作文件夹/6.html","wb")
fhandle.write(data)
fhandle.close()
